#ifndef __TASKQUEUE_H__
#define __TASKQUEUE_H__

#include <queue>
#include <mutex>
#include <condition_variable>
#include <functional>

using std::condition_variable;
using std::function;
using std::mutex;
using std::queue;
using std::unique_lock;

typedef function<void()> Task;

class TaskQueue
{
public:
    TaskQueue(size_t capa);
    ~TaskQueue();

    // 生产数据与消费数据
    void push(Task &&taskcb);
    Task pop();

    // 判空与判满
    bool empty() const;
    bool full() const;

    // 将所有等待在_notEmpty条件变量上的线程全部唤醒
    void wakeup();

private:
    size_t _capacity;             // 任务队列的大小
    queue<Task> _que;         // 存放数据的数据结构
    mutex _mutex;                 // 互斥锁
    condition_variable _notFull;  // 非满条件变量
    condition_variable _notEmpty; // 非空条件变量
    bool _flag;                   // 标识
};

#endif